//
// Created by ls on 23-12-24.
//
#include <iostream>
#include <utility>
#include <vector>
#include <deque>
#include <random>
#include <ctime>
#include <algorithm>  // 标准算法头文件

/*
 * 有 5 名选手：选手 ABCDE,10 个评委分别对每一名选手打分，去除最高分，去除评委中最低分，取平均分
 */

class Person
{
public:
  Person(std::string name, int score)
  {
    this->m_Name  = std::move(name);
    this->m_Score = score;
  }
  std::string m_Name;   // 姓名
  int m_Score;          // 平均分
};

void createPerson(std::vector<Person> &v)
{
  std::string nameSeed = "ABCDE";
  for (int i = 0; i < 5; i++) {
    std::string name = "选手";
    name += nameSeed[i];
    
    int score = 0;
    
    Person p(name, score);
    v.push_back(p);
  }
}

// 打分
void setScore(std::vector<Person> &v)
{
  // 使用随机设备生成种子
  std::random_device rd;
  // 使用生成的种子作为随机数引擎的种子
  std::mt19937 gen(rd());
  // 定义一个正态分布，均值为80，标准差为10
  std::normal_distribution<> dist(80, 10);


  for (auto &it : v) {
    // 将评委打的分数 放入到 deque 容器中
    std::deque<int> d;
    for (int i = 0; i < 10; i++) {
      int score;
      // 循环直到生成一个在60到100范围内的分数
      do {
        score = static_cast<int>(std::round(dist(gen)));
      } while (score < 60 || score > 100);

      d.push_back(score);
    }
    
    // 输出选手的分数
    std::cout << "选手：" << it.m_Name << ", 打分：" << std::endl;
    for (auto &dit : d) {
      std::cout << dit << " ";
    }
    std::cout << std::endl;
    
    // 排序；
    std::sort(d.begin(), d.end());
    // 去除最高最低分
    d.pop_front();
    d.pop_back();
    
    // 取平均分
    int sum = 0;
    for (auto &dit : d)
      sum += dit;

    
    int avg = sum / (d.size());
    it.m_Score = avg;
  }
}

void showScore(std::vector<Person> &v)
{
  for (auto &it : v) {
    std::cout << "姓名：" << it.m_Name << ", 分数：" << it.m_Score << std::endl;
  }
  std::cout << std::endl;
}

int main()
{
  // 根据时间的伪随机数种子
  // srand( (unsigned int)time(nullptr));
  // 1、创建 5 名选手
  std::vector<Person> v;  // 存放选手容器
  createPerson(v);
  // 测试
  // for (const auto &it : v) {
  //   std::cout << "姓名：" << it.m_Name << ", 分数：" << it.m_Score << std::endl;
  // }
  // 2、给 5 名选手打分
  setScore(v);
  
  // 3、显示最后得分
  showScore(v);
  return 0;
}

